/**
 * 倒三角桁架荷载计算算法模块
 * 提供桥梁跨越大腿结构中倒三角桁架自重荷载的精确计算功能
 * 考虑桁架的几何尺寸、材料特性和杆件配置进行荷载分析
 */

/**
 * 倒三角桁架荷载计算算法类
 * 实现倒三角桁架自重荷载计算方法，包括各组成部分重量计算
 * 适用于桥梁跨越结构设计中的荷载评估
 */
export class InvertedTriangularTrussLoadAlgorithms {
  /**
   * 计算倒三角桁架自重荷载
   * 根据倒三角桁架的几何尺寸、材料特性和构件规格，计算各组成部分及整体的重量和线荷载
   * 考虑上弦杆、下弦杆、腹杆（包括斜腹杆和竖腹杆）、上弦横杆和上弦斜杆的重量
   * 
   * @param {number} length 桁架长度 (m)
   * @param {number} height 桁架高度 (m)
   * @param {number} width 桁架宽度 (m)
   * @param {number} topChordDiameter 上弦杆直径 (m)
   * @param {number} bottomChordDiameter 下弦杆直径 (m)
   * @param {number} webDiameter 腹杆直径 (m)
   * @param {number} topChordThickness 上弦杆壁厚 (m)
   * @param {number} bottomChordThickness 下弦杆壁厚 (m)
   * @param {number} webThickness 腹杆壁厚 (m)
   * @param {number} steelDensity 钢材密度 (kg/m³)
   * @param {number} verticalWebSpacing 竖腹杆间隔 (m)
   * @param {number} topChordHorizontalDiameter 上弦横杆直径 (m)
   * @param {number} topChordDiagonalDiameter 上弦斜杆直径 (m)
   * @param {number} topChordHorizontalThickness 上弦横杆壁厚 (m)
   * @param {number} topChordDiagonalThickness 上弦斜杆壁厚 (m)
   * @returns {Object} 倒三角桁架自重荷载计算结果对象
   * @returns {number} return.topChordWeight - 上弦杆总重量(kg)
   * @returns {number} return.bottomChordWeight - 下弦杆总重量(kg)
   * @returns {number} return.webWeight - 腹杆总重量(kg)
   * @returns {number} return.totalWeight - 桁架总重量(kg)
   * @returns {number} return.linearLoad - 桁架线荷载(N/m)
   */
  static calculateSelfWeightLoad(
    length: number,
    height: number,
    width: number,
    topChordDiameter: number,
    bottomChordDiameter: number,
    webDiameter: number,
    topChordThickness: number,
    bottomChordThickness: number,
    webThickness: number,
    steelDensity: number,
    verticalWebSpacing: number,
    topChordHorizontalDiameter: number,
    topChordDiagonalDiameter: number,
    topChordHorizontalThickness: number,
    topChordDiagonalThickness: number,
  ): {
    topChordWeight: number;
    bottomChordWeight: number;
    webWeight: number;
    totalWeight: number;
    linearLoad: number;
  } {
    // 计算面板数 = 桁架长度 / 竖腹杆间隔，至少为1个面板
    const panels = Math.max(1, Math.round(length / verticalWebSpacing));
    // 计算上弦杆重量 (倒三角桁架有2根上弦杆)
    // 计算上弦杆圆环截面积
    const topChordCrossSectionArea = Math.PI * (
      Math.pow(topChordDiameter / 2, 2) - 
      Math.pow((topChordDiameter - 2 * topChordThickness) / 2, 2)
    );
    
    // 计算上弦杆总体积 = 单根截面积 * 长度 * 数量(2根)
    const topChordVolume = topChordCrossSectionArea * length * 2;
    
    // 计算上弦杆总重量 = 体积 * 钢材密度
    const topChordWeight = topChordVolume * steelDensity;

    // 计算下弦杆重量 (倒三角桁架有1根下弦杆)
    // 计算实际竖杆间隔
    const verticalSpacing = length / panels;
    
    // 计算下弦杆长度 = 桁架长度 - 2 * 竖杆间隔 (考虑三角形结构特点)
    const bottomChordLength = length - (2 * verticalSpacing);
    
    // 计算下弦杆圆环截面积
    const bottomChordCrossSectionArea = Math.PI * (
      Math.pow(bottomChordDiameter / 2, 2) - 
      Math.pow((bottomChordDiameter - 2 * bottomChordThickness) / 2, 2)
    );
    
    // 计算下弦杆体积
    const bottomChordVolume = bottomChordCrossSectionArea * bottomChordLength;
    
    // 计算下弦杆重量
    const bottomChordWeight = bottomChordVolume * steelDensity;

    // 计算腹杆重量 (倒三角桁架腹杆系统)
    // 斜腹杆数量 = 面板数
    const diagonalWebCount = panels;  // 斜腹杆数量
    
    // 竖腹杆数量 = 面板数 - 1
    const verticalWebCount = panels - 1;  // 竖腹杆数量

    // 计算单根腹杆长度
    const panelLength = length / panels;  // 面板长度
    
    // 斜腹杆长度 = √(面板长度² + 桁架高度² + (桁架宽度/2)²) (空间三维长度)
    const diagonalWebLength = Math.sqrt(Math.pow(panelLength, 2) + Math.pow(height, 2) + Math.pow(width / 2, 2));
    
    // 竖腹杆长度 = √(桁架高度² + (桁架宽度/2)²) (空间三维长度)
    const verticalWebLength = Math.sqrt(Math.pow(height, 2) + Math.pow(width / 2, 2));

    // 计算斜腹杆总体积 = 数量 * 单根长度 * 单根截面积
    const diagonalWebVolume = diagonalWebCount * diagonalWebLength * Math.PI * (
      Math.pow(webDiameter / 2, 2) - 
      Math.pow((webDiameter - 2 * webThickness) / 2, 2)
    );
    
    // 计算竖腹杆总体积 = 数量 * 单根长度 * 单根截面积
    const verticalWebVolume = verticalWebCount * verticalWebLength * Math.PI * (
      Math.pow(webDiameter / 2, 2) - 
      Math.pow((webDiameter - 2 * webThickness) / 2, 2)
    );
    
    // 计算上弦横杆和上弦斜杆重量
    // 上弦横杆数量 = 竖腹杆数量 + 2 (考虑两端)
    const topChordHorizontalCount = verticalWebCount + 2;
    
    // 上弦斜杆数量 = 斜腹杆数量
    const topChordDiagonalCount = diagonalWebCount;
    
    // 上弦横杆长度 = 桁架宽度
    const topChordHorizontalLength = width;
    
    // 上弦斜杆长度 = √(竖腹杆间隔² + 桁架宽度²) (二维平面长度)
    const topChordDiagonalLength = Math.sqrt(Math.pow(verticalWebSpacing, 2) + Math.pow(width, 2));
    // 计算上弦横杆总体积
    const topChordHorizontalVolume = topChordHorizontalCount * topChordHorizontalLength * Math.PI * (
      Math.pow(topChordHorizontalDiameter / 2, 2) - 
      Math.pow((topChordHorizontalDiameter - 2 * topChordHorizontalThickness) / 2, 2)
    );
    
    // 计算上弦斜杆总体积
    const topChordDiagonalVolume = topChordDiagonalCount * topChordDiagonalLength * Math.PI * (
      Math.pow(topChordDiagonalDiameter / 2, 2) - 
      Math.pow((topChordDiagonalDiameter - 2 * topChordDiagonalThickness) / 2, 2)
    );

    // 计算上弦横杆重量
    const topChordHorizontalWeight = topChordHorizontalVolume * steelDensity;
    
    // 计算上弦斜杆重量
    const topChordDiagonalWeight = topChordDiagonalVolume * steelDensity;
    
    // 计算腹杆总体积
    const webVolume = diagonalWebVolume + verticalWebVolume;
    
    // 计算腹杆总重量 = 腹杆体积重量 + 上弦横杆重量 + 上弦斜杆重量
    const webWeight = webVolume * steelDensity + topChordHorizontalWeight + topChordDiagonalWeight;

    // 计算桁架总重量 = 上弦杆重量 + 下弦杆重量 + 腹杆总重量
    const totalWeight = topChordWeight + bottomChordWeight + webWeight;

    // 计算桁架线荷载 = 总重量 * 重力加速度 / 桁架长度 (单位：N/m)
    const linearLoad = (totalWeight * 9.81) / length;

    // 返回计算结果，所有数值保留两位小数
    return {
      topChordWeight: parseFloat(topChordWeight.toFixed(2)),
      bottomChordWeight: parseFloat(bottomChordWeight.toFixed(2)),
      webWeight: parseFloat(webWeight.toFixed(2)),
      totalWeight: parseFloat(totalWeight.toFixed(2)),
      linearLoad: length > 0 ? parseFloat(linearLoad.toFixed(2)) : 0 // 防止除零错误
    };
  }
}